package com.xq.aop.annotation;

import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

/**
 * @author xq
 * @version 1.0
 * @date 2021/4/6 15:42
 * @description 注解方式实现切面
 */
// 让spring容器知道，这个类是一个切面类
@Aspect
// 让Spring Ioc去创建对象
@Component
public class MyAdviseAnnotation {

    /**
     * 切入点
     * 两个..代表所有子目录；最后括号里的两个..代表所有参数
     */
    @Pointcut("execution( * com.xq.pojo.*..*(..))")
    public void pointCut() {
    }

    /**
     * 前置通知
     */
//  @Before("pointCut()")
    public void before() {
        System.out.println("先前拿水果种子");
    }

    /**
     * 后置通知
     */
//     @After("pointCut()")
    public void after() {
        System.out.println("水果播种后浇水");
    }

    /**
     * 循环通知
     * @param pj 连接点
     */
//     @Around("pointCut()")
    public void around(ProceedingJoinPoint pj) {
        try {
            before();
            // 执行目标对象的方法
            pj.proceed();
            after();
        } catch (Throwable throwable) {
            throwable.printStackTrace();
        }
    }

    /**
     * 异常通知
     * @param tw 必须和@AfterThrowing注解上的throwing属性的值一样
     */
   @AfterThrowing(value = "pointCut()",throwing = "tw")
    public void exception(Throwable tw){
        System.out.println("发生异常");
        System.out.println(tw.getMessage());
    }
}
